19-1 MATLAB v璁?

MATLAB 最常處理的影像格式為索引影像(Indexed Images),欲顯示此類影像時,使用語法如下:

image(X); colormap(map);

其中 X 代表影像的資料矩陣,map 則是顯示此影像所必需用到的「色盤矩陣」(Colormap Matrix)或是「顏色對照表」 。一般而言,欲顯示 K 種不同顏色,色盤矩陣必需是一個 K×3 的矩陣,其中每一橫列代表一種顏色,每一顏色由三個元素組成,元素值由 0 至 1,分別代表 R(Red,紅色),G(Green,綠色),B(Blue,藍色)的份量。X 的元素值範圍為 1 至 K,代表每一個像素(Pixel)的顏色。換句話說,若 X (i, j) 的值為 p,則 X (i, j) 此點像素的顏示即由 map (p, :) 所決定,其中 map (p, 1),map (p, 2) 及 map (p, 3) 分別代表紅色、綠色及藍色的份量。

Hint
MATLAB 有現成的色盤矩陣(或顏色對照表),請參考本書第四章「三維立體繪圖」的第三節「曲面顏色的控制」。

舉例來說,MATLAB 有一個內建的小丑影像,可顯示如下:

Example 1: 19-影像顯示與讀寫/image01.mload clown.mat % 載入小丑影像資料,含變數 X 和 map image(X); % 顯示影像 colormap(map) % 取用色盤矩陣

由於 X 是索引影像,因此其最小值是 1, 最大值會等於 map 的列數(即「可顯示之顏色數目」),可驗証如下:

Example 2: 19-影像顯示與讀寫/image02.mload clown.mat % 載入小丑影像資料,含變數 X 和 map fprintf('min(min(X)) = %d\n', min(min(X))); fprintf('max(max(X)) = %d\n', max(max(X))); fprintf('size(map, 1) = %d\n', size(map, 1));min(min(X)) = 1 max(max(X)) = 81 size(map, 1) = 81

由上述範例可知,此小丑影像共含有 81 種不同的顏色。

欲正確地顯示索引影像,需有正確的色盤矩陣,否則顯示出來的顯像會難以辨認,以上述小丑影像為例,如果取用以亂數產生的色盤矩陣,則產生下列效果:

Example 3: 19-影像顯示與讀寫/image03.mload clown newmap = rand(size(map)); image(X); colormap(newmap); colorbar;

如果我們的色盤矩陣只有 K 個橫列,但是 X 的某些元素值小於 1 或大於 K,那麼如何顯示這個矩陣呢?最簡單的辦法,是將 X 的最小值轉換成 1,最大值轉成 K,其他中間值則依線性關係轉換成介於 1 與 K 的值,再依色盤矩陣來顯示此矩陣。此項轉換工作可由 imagesc 指令直接達成,舉例如下:

Example 4: 19-影像顯示與讀寫/imagesc01.mtemp=colormap(gray); newMap=temp(1:6:end, :); X = peaks; colormap(newMap); imagesc(X); colorbar; min(min(X)) % 顯示 X 的最小值 max(max(X)) % 顯示 X 的最大值 ans = -6.5466 ans = 8.0752

在上例中,雖然 X 的最大值為 8.0752,最小值為 -6.5466,但 imagesc 可經由前述的線性轉換過程來顯示影像。具有上述特性的影像資料稱為強度影像(Intensity Images),一般經由數值運算產生的矩陣均屬此類,因此均可由 imagesc 來顯示。

Hint
peaks 指令可以產生一個凹凸有緻的曲面,詳見本書第四章「三維立體繪圖」的說明。

除了索引影像及強度影像外,image 指令亦接受全彩影像(Truecolor Images)。全彩影像可以表示成一個 m×n×3 的矩陣 X,其中 X (:, :, 1) 代表紅色的強度。X (:, :, 2) 代表綠色的強度,X (:, :, 3) 則代表藍色的強度。X 的元素值可以是介於 0 和 1 中間的浮點數,或是介於 0 和 255 中間的 8 位元、不帶符號的整數(uint8,詳情請參閱本章第三節)。舉例來說:

Example 5: 19-影像顯示與讀寫/image04.m%X = imread('ngc6543a.jpg'); X = imread('annie19980405.jpg'); image(X) size(X) ans = 480 640 3

以上即為一張全彩的圖片,完全不需要用到色盤矩陣。(在上列程式碼中,imread 是用來讀入影像檔的指令,詳見本章最後一節。)

Hint
上圖是筆者女兒四歲半的照片,實在很可愛,忍不住放上來,請各位讀者不要見怪…


MATLAB程式設計:入門篇